package br.com.jkar.dao;

import br.com.jkar.bean.Endereco;
import br.com.jkar.bean.Funcionario;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Jacqueline
 */
public class FuncionarioDAOImpl implements FuncionarioDAO {

    private Connection conn = null;
    private PreparedStatement pst = null;
    private ResultSet rs = null;
    private Funcionario funcionario;

    private static final String IDFUNCIONARIO = "f.pessoa_id";
    private static final String NOME = "nome";
    private static final String CPF = "cpf";
    private static final String RG = "rg";
    private static final String EMAIL = "email";
    private static final String TEL = "telfixo";
    private static final String CEL = "celular";
    private static final String IDEND = "e.id";
    private static final String RUA = "rua";
    private static final String BAIRRO = "bairro";
    private static final String CIDADE = "cidade";
    private static final String ESTADO = "estado";
    private static final String CEP = "cep";

    @Override
    public Funcionario salvar(Funcionario funcionario) throws Exception {
        PessoaDAO peDAO = new PessoaDAOImpl();
        peDAO.salvar(funcionario);

        try {
            String SQL = "INSERT INTO funcionario(cracha, idPessoa) "
                    + "VALUES(?, ?)";
            conn = FabricarConexao.abrirConexao();
            pst = conn.prepareStatement(SQL);
            pst.setInt(1, funcionario.getCracha());
            pst.setInt(2, funcionario.getId());
            pst.executeUpdate();

        } catch (SQLException se) {
            throw new Exception("Erro ao tentar inserir dados" + se.getMessage());
        } finally {
            FabricarConexao.fecharConexao(conn, pst);
        }
        return funcionario;
    }

    @Override
    public Funcionario alterar(Funcionario funcionario) throws Exception {
        PessoaDAO pessoaDAO = new PessoaDAOImpl();
        pessoaDAO.alterar(funcionario);
        return funcionario;
    }

    @Override
    public void excluir(Integer id) throws Exception {
        System.out.println("Excluindo o funcionario selecionado...");
        try {
            conn = FabricarConexao.abrirConexao();
            String stmt = "DELETE FROM funcionario WHERE id = ?";
            pst = conn.prepareStatement(stmt);
            pst.setInt(1, id);
            pst.executeUpdate();
        } catch (Exception e) {
            System.out.println("Erro ao excluir os dados do funcionario: " + e.getMessage());
        } finally {
            FabricarConexao.fecharConexao(conn, pst);
        }
    }

    @Override
    public Funcionario procurar(Integer id) throws Exception {
        System.out.println("Pesquisando ID do item selecionado...");
        // Funcionario funcionario = new Funcionario();
        try {
            conn = FabricarConexao.abrirConexao();
            String stmt = "SELECT * FROM funcionario f "
                    + "JOIN pessoa p ON f.pessoa_id = p.id "
                    + "JOIN endereco e ON p.endereco_id = e.id "
                    + "WHERE f.pessoa_id = ?";
            pst = conn.prepareStatement(stmt);
            pst.setInt(1, id);
            rs = pst.executeQuery();
            rs.next();
            setarFuncionario(rs, funcionario);
        } catch (Exception e) {
            System.out.println("Erro ao procurar item por ID no BD: " + e.getMessage());
            throw new Exception(e.getMessage());
        } finally {
            FabricarConexao.fecharConexao(conn, pst);
        }
        return funcionario;
    }

    private Funcionario setarFuncionario(ResultSet rs, Funcionario funcionario) {
        try {
            funcionario.setId(rs.getInt(IDFUNCIONARIO));
            funcionario.setNome(rs.getString(NOME));
            funcionario.setCpf(rs.getString(CPF));
            funcionario.setRg(rs.getString(RG));
            funcionario.setEmail(rs.getString(EMAIL));
            funcionario.setTelFixo(rs.getString(TEL));
            funcionario.setCelular(rs.getString(CEL));
            funcionario.setEndereco(new Endereco());
            funcionario.getEndereco().setRua(rs.getString(RUA));
            funcionario.getEndereco().setBairro(rs.getString(BAIRRO));
            funcionario.getEndereco().setCidade(rs.getString(CIDADE));
            funcionario.getEndereco().setEstado(rs.getString(ESTADO));
            funcionario.getEndereco().setCep(rs.getString(CEP));
        } catch (SQLException ex) {
            Logger.getLogger(ClienteDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        return funcionario;

    }

    @Override
    public List<Funcionario> listar() throws Exception {
        List<Funcionario> funcionarios = new ArrayList<>();
      //  Funcionario funcionario;
        try {
            conn = FabricarConexao.abrirConexao();
            String stmt = "SELECT * FROM funcionario f "
                    + "JOIN pessoa p ON f.pessoa_id = p.id "
                    + "JOIN endereco e ON p.endereco_id = e.id";
            pst = conn.prepareStatement(stmt);
            rs = pst.executeQuery();
            while (rs.next()) {
                funcionario = new Funcionario();
                funcionarios.add(setarFuncionario(rs, funcionario));
            }
        } catch (Exception e) {
            System.out.println("Erro ao listar os dados do funcionario: "
                    + e.getMessage());
        } finally {
            FabricarConexao.fecharConexao(conn, pst);
        }
        return funcionarios;

    }

    @Override
    public List<Funcionario> listarPorNome(String nome) throws Exception {
        List<Funcionario> funcionarios = new ArrayList<>();
        //   Funcionario funcionario;
        try {
            conn = FabricarConexao.abrirConexao();
            String stmt = "SELECT * FROM funcionario f "
                    + "JOIN pessoa p ON f.pessoa_id = p.id "
                    + "JOIN endereco e ON p.endereco_id = e.id "
                    + "WHERE p.nome LIKE ?";
            pst = conn.prepareStatement(stmt);
            pst.setString(1, "%" + nome + "%");
            rs = pst.executeQuery();
            while (rs.next()) {
                funcionario = new Funcionario();
                funcionarios.add(setarFuncionario(rs, funcionario));
            }
        } catch (Exception e) {
            System.out.println("Erro ao listar os dados do funcionario: "
                    + e.getMessage());
        } finally {
            FabricarConexao.fecharConexao(conn, pst);
        }
        return funcionarios;
    }
}
